const RedBlackTree = require("../template")

function testRedBlackTreeRotations() {
  console.log(
    "1. 左旋转基本测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 构造需要左旋转的情况
      rbt.insert(10)
      rbt.insert(20)
      rbt.insert(30)
      
      // 验证树结构正确
      return rbt.search(10) !== null &&
             rbt.search(20) !== null &&
             rbt.search(30) !== null &&
             rbt.isValid() === true
    })()
  )

  console.log(
    "2. 右旋转基本测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 构造需要右旋转的情况
      rbt.insert(30)
      rbt.insert(20)
      rbt.insert(10)
      
      // 验证树结构正确
      return rbt.search(10) !== null &&
             rbt.search(20) !== null &&
             rbt.search(30) !== null &&
             rbt.isValid() === true
    })()
  )

  console.log(
    "3. 左右旋转组合测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 构造需要左右旋转的情况
      rbt.insert(10)
      rbt.insert(30)
      rbt.insert(20)
      
      // 验证树结构正确
      return rbt.search(10) !== null &&
             rbt.search(20) !== null &&
             rbt.search(30) !== null &&
             rbt.isValid() === true
    })()
  )

  console.log(
    "4. 右左旋转组合测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 构造需要右左旋转的情况
      rbt.insert(30)
      rbt.insert(10)
      rbt.insert(20)
      
      // 验证树结构正确
      return rbt.search(10) !== null &&
             rbt.search(20) !== null &&
             rbt.search(30) !== null &&
             rbt.isValid() === true
    })()
  )

  console.log(
    "5. 多次旋转测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 插入数据触发多次旋转
      const values = [50, 30, 70, 20, 40, 60, 80, 10, 25, 35, 45]
      values.forEach(val => rbt.insert(val))
      
      // 验证所有值都存在且树结构正确
      const allFound = values.every(val => rbt.search(val) !== null)
      
      return allFound &&
             rbt.isValid() === true &&
             rbt.getSize() === values.length
    })()
  )

  console.log(
    "6. 旋转后中序遍历测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 插入数据
      const values = [50, 30, 70, 20, 40, 60, 80]
      values.forEach(val => rbt.insert(val))
      
      // 获取中序遍历结果
      const inorder = rbt.inorder()
      const expected = values.sort((a, b) => a - b)
      
      return JSON.stringify(inorder) === JSON.stringify(expected) &&
             rbt.isValid() === true
    })()
  )

  console.log(
    "7. 旋转后最小最大值测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 插入数据
      const values = [50, 30, 70, 20, 40, 60, 80, 10, 25, 35, 45]
      values.forEach(val => rbt.insert(val))
      
      const min = rbt.getMin()
      const max = rbt.getMax()
      const expectedMin = Math.min(...values)
      const expectedMax = Math.max(...values)
      
      return min === expectedMin &&
             max === expectedMax &&
             rbt.isValid() === true
    })()
  )

  console.log(
    "8. 旋转后树高度测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 插入数据
      const values = [50, 30, 70, 20, 40, 60, 80, 10, 25, 35, 45]
      values.forEach(val => rbt.insert(val))
      
      const height = rbt.getHeight()
      const size = rbt.getSize()
      
      // 红黑树高度应该不超过2*log2(n+1)
      const maxHeight = 2 * Math.log2(size + 1)
      
      return height <= maxHeight &&
             height > 0 &&
             rbt.isValid() === true
    })()
  )

  console.log(
    "9. this上下文旋转测试:",
    (() => {
      const rotationObj = {
        multiplier: 2,
        processRotations: function(values) {
          const rbt = new RedBlackTree()
          values.forEach(val => rbt.insert(val))
          return rbt.getSize() * this.multiplier
        }
      }
      
      const values = [10, 20, 30, 40, 50]
      return rotationObj.processRotations(values) === 10 // 5*2=10
    })()
  )

  console.log(
    "10. 复杂对象this绑定旋转测试:",
    (() => {
      const rotationConfigObj = {
        config: { threshold: 3 },
        processWithConfig: function(values) {
          const rbt = new RedBlackTree()
          values.forEach(val => rbt.insert(val))
          return rbt.getSize() >= this.config.threshold
        }
      }
      
      const values = [10, 20, 30]
      return rotationConfigObj.processWithConfig(values) === true
    })()
  )

  console.log(
    "11. 旋转一致性测试:",
    (() => {
      const rbt1 = new RedBlackTree()
      const rbt2 = new RedBlackTree()
      
      const values = [50, 30, 70, 20, 40, 60, 80]
      
      // 相同的数据插入顺序
      values.forEach(val => {
        rbt1.insert(val)
        rbt2.insert(val)
      })
      
      // 验证结果一致
      const inorder1 = rbt1.inorder()
      const inorder2 = rbt2.inorder()
      const isValid1 = rbt1.isValid()
      const isValid2 = rbt2.isValid()
      
      return JSON.stringify(inorder1) === JSON.stringify(inorder2) &&
             isValid1 === isValid2 &&
             isValid1 === true
    })()
  )

  console.log(
    "12. 旋转边界测试:",
    (() => {
      const rbt = new RedBlackTree()
      
      // 测试最小旋转情况
      rbt.insert(1)
      rbt.insert(2)
      rbt.insert(3)
      
      // 验证树结构
      const isValid = rbt.isValid()
      const size = rbt.getSize()
      const height = rbt.getHeight()
      
      return isValid === true &&
             size === 3 &&
             height <= 3 && // 红黑树高度限制
             rbt.search(1) !== null &&
             rbt.search(2) !== null &&
             rbt.search(3) !== null
    })()
  )
}

testRedBlackTreeRotations()
